package com.topsail.demo.xxx.api;

import lombok.Getter;
import lombok.Setter;

/**
 * <B>主类名称：</B>Rest<BR>
 * <B>概要说明：</B>Rest接口，返回数据结构<BR>
 *
 * @author steven.zhoulin
 *
 * @since 2023年7月10日 15:36
 */
@Setter
@Getter
public class Rest {

    /**
     * 成功返回码
     */
    private static final int SUCCESS_CODE = 0;

    /**
     * 默认失败返回码
     */
    private static final int FAILURE_CODE = -1;

    /**
     * 响应码，0：成功，非0：失败
     */
    public int code;

    /**
     * 响应信息
     */
    public String message;

    /**
     * 响应数据
     */
    public Object data;

    /**
     * 成功
     *
     * @return
     */
    public static Rest success() {
        Rest rest = new Rest();
        rest.setCode(SUCCESS_CODE);
        return rest;
    }

    /**
     * 成功
     *
     * @param data
     * @return
     */
    public static Rest success(Object data) {
        Rest rest = new Rest();
        rest.setCode(SUCCESS_CODE);
        rest.setData(data);
        rest.setMessage("");
        return rest;
    }

    /**
     * 成功
     *
     * @param data
     * @param message
     * @return
     */
    public static Rest success(Object data, final String message) {
        Rest rest = new Rest();
        rest.setCode(SUCCESS_CODE);
        rest.setData(data);
        rest.setMessage(message);
        return rest;
    }

    /**
     * 失败
     *
     * @param code 失败编码
     * @return
     */
    public static Rest failure(final int code) {
        return failure(code, "failure", "");
    }

    /**
     * 失败
     *
     * @param code 失败编码
     * @param message 失败信息
     * @return
     */
    public static Rest failure(final int code, final String message) {
        return failure(code, message, null);
    }

    /**
     * 失败
     *
     * @param code 失败编码
     * @param message 失败信息
     * @param data 失败时返回的数据
     * @return
     */
    public static Rest failure(final int code, final String message, Object data) {
        Rest rest = new Rest();
        rest.setCode(code);
        rest.setMessage(message);
        rest.setData(data);

        if (SUCCESS_CODE == code) { // 兜底策略：失败时，不能返回成功编码
            rest.setCode(FAILURE_CODE);
        }

        return rest;
    }

}
